
from langchain.output_parsers import YamlOutputParser
from langchain.chat_models import ChatOpenAI
from pydantic.v1 import BaseModel, Field  # 使用 pydantic.v1 命名空间
from langchain.prompts import PromptTemplate  # 确保导入路径正确

model = ChatOpenAI(model_name="gpt-4")

# 定义您期望的数据结构
class Joke(BaseModel):
    setup: str = Field(description="设置笑话的问题")
    punchline: str = Field(description="解决笑话的答案")

# 还有一个用于提示语言模型填充数据结构的查询意图
joke_query = "告诉我一个笑话。"

# 设置解析器 + 将指令注入模板
parser = YamlOutputParser(pydantic_object=Joke)

prompt = PromptTemplate(
    template="回答用户的查询\n{format_instructions}\n{query}\n",  # 将解析器的模块format_instructions，告诉提示词目标，这里的format_instructions 等于partial_variables中的format_instructions
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

print("format_instructions:", parser.get_format_instructions())

chain = prompt | model | parser
response = chain.invoke({"query": joke_query})
print(response)